home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / ACORNUSERS / CBSA / EDUCATION / SAVER / cc / WimpTask < prev   
Text File  |  1997-12-20  |  4KB  |  164 lines

  1.  
  2. //-----------------------------------
  3. //             WimpTask.c
  4. //-----------------------------------
  5.  
  6.  
  7. #include <string.h>
  8. #include <os.h>
  9. #include <trap.h>
  10. #include "WimpError.h"
  11. #include "WimpTask.h"
  12.  
  13. WimpTask::WimpTask(char *info, int wimp_version, int *message_list)
  14. {
  15.   int r[10];
  16.   os_error *e;
  17.   
  18.   strncpy(taskname, info, 31);
  19.   taskname[31] = 0;
  20.   r[0] = wimp_version;
  21.   r[1] = 'T' +
  22.         ('A' << 8) +
  23.         ('S' << 16) +
  24.         ('K' << 24);
  25.   r[2] = (int) taskname;
  26.   r[3] = (int) message_list;
  27.   if ((e = os_swi (Wimp_Initialise, r)) != NULL) throw(e);
  28.   handle = r[1];
  29.   FileSize = 0;
  30.   FileType = 0xfff;
  31.   FileName[0] = 0;
  32.   EnableEvent(ESEND);
  33.   EnableEvent(ESENDWANTACK);
  34. }
  35.  
  36. WimpTask::~WimpTask()
  37. {
  38.   int r[10];
  39.   
  40.   r[0] = handle;
  41.   r[1] = 'T' +
  42.         ('A' << 8) +
  43.         ('S' << 16) +
  44.         ('K' << 24);
  45.   os_swi(Wimp_CloseDown, r);  
  46. }
  47.  
  48. bool WimpTask::load(char *path, int a, int b)
  49. {
  50.   return FALSE;
  51. }
  52.  
  53. bool WimpTask::save(char *path, int &a)
  54. {
  55.   a=0;
  56.   return FALSE;
  57. }
  58.  
  59. bool WimpTask::receive()
  60. {
  61.   int r[10];
  62.   os_error *e;
  63.   bool quit;
  64.   
  65.   switch(User_Message.code)
  66.   { 
  67.     case 0:            // Quit.
  68.       return TRUE;
  69.       break;
  70.     case 2: 
  71.     
  72.       int size;
  73.       quit = save(User_Message.data_load_ack.pathname,size);
  74.       User_Message.your_ref = User_Message.my_ref;
  75.       User_Message.code = 3;
  76.       User_Message.size = size;
  77.       r[0] = (int) ESENDWANTACK;
  78.       r[1] = (int) &User_Message;
  79.       r[2] = User_Message.data_load_ack.dest_window;
  80.       r[3] = User_Message.data_load_ack.icon;
  81.       os_swi(Wimp_SendMessage, r);
  82.       return quit;
  83.       break;
  84.       
  85.     case 3:                    // Load Event.
  86.       User_Message.your_ref = User_Message.my_ref;
  87.       User_Message.code = 4;
  88.       r[0] = (int) ESEND;
  89.       r[1] = (int) &User_Message;
  90.       r[2] = User_Message.task_sender;
  91.       os_swi(Wimp_SendMessage, r);
  92.       quit = load(User_Message.data_load_ack.pathname,
  93.                   User_Message.data_load_ack.size,
  94.                   User_Message.data_load_ack.type);
  95.       return quit;
  96.       break;
  97.     default:
  98.       return FALSE;
  99.       break;
  100.   }  
  101. }
  102.  
  103. bool WimpTask::UserDrag()
  104. {
  105.   int r[10];
  106.   os_error *e;
  107.   
  108.   r[0] = (int) &Mouse_Click;
  109.   e = os_swi(Wimp_GetPointerInfo, r);
  110.   
  111.   User_Message.data_load_ack.dest_window = Mouse_Click.window;
  112.   User_Message.data_load_ack.icon = Mouse_Click.icon;
  113.   User_Message.data_load_ack.x = Mouse_Click.x;
  114.   User_Message.data_load_ack.y = Mouse_Click.y;
  115.   User_Message.data_load_ack.size = FileSize;
  116.   User_Message.data_load_ack.type = FileType;
  117.   strcpy(User_Message.data_load_ack.pathname,FileName);
  118.   User_Message.size = 64;
  119.   User_Message.your_ref = 0;
  120.   User_Message.code = 1;    // DataSave
  121.   r[0] = 17;
  122.   r[1] = (int) &User_Message;
  123.   r[2] = User_Message.data_load_ack.dest_window; //Send to this window's creator
  124.   r[3] = User_Message.data_load_ack.icon; // Send to icon's task. only if r2=-2
  125.   e = os_swi(Wimp_SendMessage, r); 
  126.   return FALSE; 
  127. }
  128.  
  129. void WimpTask::run()
  130. {
  131.   int r[10];
  132.   os_error *e;
  133.   bool quit = 0;
  134.   
  135.   while (!quit)
  136.   {
  137.     r[0] = mask_event;
  138.     r[1] = (int) block;
  139.     if ((e = os_swi(Wimp_Poll, r)) != NULL) throw (e);
  140.     
  141.     switch (r[0])
  142.     {
  143.       case ENULL :     quit = NullEvent();    break;
  144.       case EREDRAW :     quit = RedrawWindow();    break;
  145.       case EOPEN:    quit = OpenWindow();    break;
  146.       case ECLOSE:    quit = CloseWindow();    break;
  147.       case EPTRLEAVE:    quit = PointerLeave(); break;
  148.       case EPTRENTER:   quit = PointerEnter(); break;
  149.       case EBUT:    quit = ButtonPressed(); break;
  150.       case EUSERDRAG:    quit = UserDrag(); break;
  151.       case EKEY:        quit = KeyPressed(); break;
  152.       case EMENU:    quit = MenuSelected(); break;
  153.       case ESCROLL:    quit = Scrolled(); break;
  154.       case ELOSECARET:    quit = LoseCaret(); break;
  155.       case EGAINCARET:    quit = GainCaret(); break;
  156.       case EPOLLNONZERO: quit = PollNonZero(); break;
  157.       case ESEND:    quit = receive();    break;
  158.       case ESENDWANTACK: quit = receive();    break;
  159.       case EACK:    quit = Acknowledge(); break;
  160.       default:         quit = FALSE; break;
  161.     }
  162.   }
  163. }
  164.